package ar.edu.utn.frba.dds.aterrizar.aerolineas;

import java.util.ArrayList;

import com.lanchita.excepciones.CodigoErroneoException;

import ar.edu.utn.frba.dds.aterrizar.busquedas.*;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Usuario;

public abstract class AerolineasInterface {
	
	protected void validarVuelo(Vuelo vuelo, Usuario usuario) {
		if(!vuelo.esVisiblePara(this, usuario)) {
			throw new VueloNoVisibleException("El vuelo: " + vuelo.getCodigoDeVuelo() + "-" + vuelo.getCodigoDeAsiento() + " no es visible para " + usuario.getNombre() + " " + usuario.getApellido());
		}
	}
	
	public void comprarVuelo(Vuelo vuelo, Usuario usuario) {
		validarVuelo(vuelo, usuario);
		comprarElVuelo(vuelo, usuario);
	}
	
	public void reservarVuelo(Vuelo vuelo, Usuario usuario) {
		validarVuelo(vuelo, usuario);
		reservarElVuelo(vuelo, usuario);
	}
	
	protected abstract void comprarElVuelo(Vuelo vuelo, Usuario usuario);
	
	protected abstract void reservarElVuelo(Vuelo vuelo, Usuario usuario);

	public abstract ArrayList<Vuelo> getAsientosTotales();

	public abstract ArrayList<Vuelo> getAsientosBuscados(Busqueda busqueda);
	
	public abstract ArrayList<Vuelo> getAsientosBuscadosIncluyendoReservados(Busqueda busqueda);	
	
	public abstract Vuelo encontrarVueloPorCodigo(Vuelo oVuelo) ;
	
	public Vuelo encontrarVueloPorCodigo(String codigoDeVueloBuscado, String codigoDeAsientoBuscado) {
		ArrayList<Vuelo> vuelos = this.getAsientosTotales();
		for(Vuelo vuelo : vuelos) {
			if(vuelo.getCodigoDeVuelo().equalsIgnoreCase(codigoDeVueloBuscado) && vuelo.getCodigoDeAsiento().equalsIgnoreCase(codigoDeAsientoBuscado)) {
				return vuelo;
			}
		}
		throw new CodigoErroneoException(codigoDeVueloBuscado + "-" + codigoDeAsientoBuscado);
	}
	
	public int getCantidadDeAsientosVendidos(String codigoDeVuelo) {
		ArrayList<Vuelo> vuelosTotales = getAsientosTotales();
		ArrayList<Vuelo> vuelosComprados = new ArrayList<Vuelo>();
		for(Vuelo vuelo : vuelosTotales) {
			if(vuelo.getCodigoDeVuelo().equals(codigoDeVuelo) && vuelo.getEstado().equals("C")) {
				vuelosComprados.add(vuelo);
			}
		}
		return vuelosComprados.size();
	}
	
	public abstract String quienSoy();

	public abstract ArrayList<Vuelo> getReservasPorUsuario(Usuario usuario);
	public abstract ArrayList<Vuelo> getComprasPorUsuario(Usuario usuario);

}
